﻿//using System;
//using System.Collections.Generic;
//using System.Linq;
//using System.Text;
//using System.Data.Common;
//using Ubatic.Common.Dto;
//using Ubatic.Business.Helpers;
//using System.Data;

//namespace Ubatic.Business.Managers
//{
//    public class UserManager
//    {
//        #region [Basic Operations]

//        public long CreateIncompleteUser(Usuario userDto)
//        {
//            long result = 0;
//            object resultId = null;
//            string commandText = @"INSERT INTO [Usuario]
//                                               ([Email]
//                                               ,[Password]
//                                               ,[Nombre]
//                                               ,[Apellido]
//                                               ,[PreguntaSecreta]
//                                               ,[RespuestaSecreta]
//                                               ,[GuidMailConfirmacion])
//                                         VALUES
//                                               (@Email
//                                               ,@Password
//                                               ,@Nombre
//                                               ,@Apellido
//                                               ,@PreguntaSecreta
//                                               ,@RespuestaSecreta
//                                               ,@GuidMailConfirmacion); SELECT @@IDENTITY;";

//            using (DbConnection connection = DbHelper.CreateDbConnection())
//            {
//                connection.Open();

//                DbCommand command = connection.CreateCommand();
//                DbTransaction transaction = connection.BeginTransaction();

//                // Must assign both transaction object and connection
//                // to Command object for a pending local transaction
//                command.Connection = connection;
//                command.Transaction = transaction;

//                command.CommandText = commandText;

//                DbHelper.AddCommandParameter(command, "Email", userDto.Email);
//                DbHelper.AddCommandParameter(command, "Password", userDto.Password);
//                DbHelper.AddCommandParameter(command, "Nombre", userDto.Nombre);
//                DbHelper.AddCommandParameter(command, "Apellido", userDto.Apellido);
//                DbHelper.AddCommandParameter(command, "PreguntaSecreta", userDto.PreguntaSecreta);
//                DbHelper.AddCommandParameter(command, "RespuestaSecreta", userDto.RespuestaSecreta);
//                DbHelper.AddCommandParameter(command, "GuidMailConfirmacion", userDto.GuidMailConfirmacion);

//                try
//                {
//                    resultId = command.ExecuteScalar();
//                    transaction.Commit();
//                }
//                catch
//                {
//                    transaction.Rollback();
//                    throw;
//                }
//            }

//            if (resultId != null)
//            {
//                result = long.Parse(resultId.ToString());
//            }

//            return result;
//        }

//        public bool ActiveUser(Usuario userDto)
//        {
//            int result = 0;
//            string queryString = @"UPDATE [Usuario]
//                                       SET [Activo]=@Activo
//                                     WHERE Id=@Id";

//            using (DbConnection connection = DbHelper.CreateDbConnection())
//            {
//                connection.Open();

//                DbCommand command = connection.CreateCommand();
//                DbTransaction transaction;

//                // Start a local transaction.
//                transaction = connection.BeginTransaction();

//                // Must assign both transaction object and connection
//                // to Command object for a pending local transaction
//                command.Connection = connection;
//                command.Transaction = transaction;
//                command.CommandText = queryString;

//                DbHelper.AddCommandParameter(command, "Activo", userDto.Activo);
//                DbHelper.AddCommandParameter(command, "Id", userDto.Id);

//                try
//                {
//                    result = command.ExecuteNonQuery();
//                    transaction.Commit();
//                }
//                catch
//                {
//                    transaction.Rollback();
//                    throw;
//                }
//                finally
//                {
//                    if (connection != null)
//                        connection.Close();
//                }

//                return (result > 0);
//            }
//        }
//        // #TODO: cambiar los datos del insert
//        public long CreateUser(Usuario userDto)
//        {
//            long result = 0;
//            object resultId = null;
//            string commandText = @"INSERT INTO [Usuario]
//                                               ([Email]
//                                               ,[Password]
//                                               ,[Nombre]
//                                               ,[Apellido]
//                                               ,[CUIL]
//                                               ,[TipoDocumento]
//                                               ,[NroDocumento]
//                                               ,[Legajo]
//                                               ,[Activo]
//                                               ,[PreguntaSecreta]
//                                               ,[RespuestaSecreta]
//                                               ,[PathCurriculumVitae]
//                                               ,[UsuarioExperienciaDesc]
//                                               ,[GuidMailConfirmacion])
//                                         VALUES
//                                               (@Email
//                                               ,@Password>
//                                               ,@Nombre
//                                               ,@Apellido
//                                               ,@CUIL
//                                               ,@TipoDocumento
//                                               ,@NroDocumento
//                                               ,@Legajo
//                                               ,@Activo
//                                               ,@PreguntaSecreta
//                                               ,@RespuestaSecreta
//                                               ,@PathCurriculumVitae
//                                               ,@UsuarioExperienciaDesc); SELECT @@IDENTITY;";

//            using (DbConnection connection = DbHelper.CreateDbConnection())
//            {
//                connection.Open();

//                DbCommand command = connection.CreateCommand();
//                DbTransaction transaction = connection.BeginTransaction();

//                // Must assign both transaction object and connection
//                // to Command object for a pending local transaction
//                command.Connection = connection;
//                command.Transaction = transaction;

//                command.CommandText = commandText;

//                DbHelper.AddCommandParameter(command, "Email", userDto.Email);
//                DbHelper.AddCommandParameter(command, "Password", userDto.Password);
//                DbHelper.AddCommandParameter(command, "Nombre", userDto.Nombre);
//                DbHelper.AddCommandParameter(command, "Apellido", userDto.Apellido);
//                DbHelper.AddCommandParameter(command, "CUIL", userDto.CUIL);
//                DbHelper.AddCommandParameter(command, "TipoDocumento", userDto.TipoDocumento);
//                DbHelper.AddCommandParameter(command, "NroDocumento", userDto.NroDocumento);
//                DbHelper.AddCommandParameter(command, "Legajo", userDto.Legajo);
//                DbHelper.AddCommandParameter(command, "Activo", userDto.Activo);
//                DbHelper.AddCommandParameter(command, "PreguntaSecreta", userDto.PreguntaSecreta);
//                DbHelper.AddCommandParameter(command, "RespuestaSecreta", userDto.RespuestaSecreta);
//                DbHelper.AddCommandParameter(command, "PathCurriculumVitae", userDto.PathCurriculumVitae);
//                DbHelper.AddCommandParameter(command, "UsuarioExperienciaDesc", userDto.UsuarioExperienciaDesc);

//                try
//                {
//                    resultId = command.ExecuteScalar();
//                    transaction.Commit();
//                }
//                catch
//                {
//                    transaction.Rollback();
//                    throw;
//                }
//            }

//            if (resultId != null)
//            {
//                result = long.Parse(resultId.ToString());
//            }

//            return result;
//        }

//        public bool UpdateUser(Usuario userDto)
//        {
//            int result = 0;
//            string queryString = @"UPDATE [Usuario]
//                                       SET      [Email]=@Email
//                                               ,[Password]=@Password
//                                               ,[Nombre]=@Nombre
//                                               ,[Apellido]=@Apellido
//                                               ,[CUIL]=@CUIL
//                                               ,[TipoDocumentoId]=@TipoDocumentoId
//                                               ,[NroDocumento]=@NroDocumento
//                                               ,[Legajo]=@Legajo
//                                               ,[Activo]=@Activo
//                                               ,[PreguntaSecreta]=@PreguntaSecreta
//                                               ,[RespuestaSecreta]=@RespuestaSecreta
//                                               ,[PathCurriculumVitae]=@PathCurriculumVitae
//                                               ,[UsuarioExperienciaDesc]=@UsuarioExperienciaDesc
//                                     WHERE Id=@Id";

//            using (DbConnection connection = DbHelper.CreateDbConnection())
//            {
//                connection.Open();

//                DbCommand command = connection.CreateCommand();
//                DbTransaction transaction;

//                // Start a local transaction.
//                transaction = connection.BeginTransaction();

//                // Must assign both transaction object and connection
//                // to Command object for a pending local transaction
//                command.Connection = connection;
//                command.Transaction = transaction;
//                command.CommandText = queryString;

//                DbHelper.AddCommandParameter(command, "Email", userDto.Email);
//                DbHelper.AddCommandParameter(command, "Password", userDto.Password);
//                DbHelper.AddCommandParameter(command, "Nombre", userDto.Nombre);
//                DbHelper.AddCommandParameter(command, "Apellido", userDto.Apellido);
//                DbHelper.AddCommandParameter(command, "CUIL", userDto.CUIL);
//                DbHelper.AddCommandParameter(command, "TipoDocumentoId", userDto.TipoDocumento);
//                DbHelper.AddCommandParameter(command, "NroDocumento", userDto.NroDocumento);
//                DbHelper.AddCommandParameter(command, "Legajo", userDto.Legajo);
//                DbHelper.AddCommandParameter(command, "Activo", userDto.Activo);
//                DbHelper.AddCommandParameter(command, "PreguntaSecreta", userDto.PreguntaSecreta);
//                DbHelper.AddCommandParameter(command, "RespuestaSecreta", userDto.RespuestaSecreta);
//                DbHelper.AddCommandParameter(command, "PathCurriculumVitae", userDto.PathCurriculumVitae);
//                DbHelper.AddCommandParameter(command, "UsuarioExperienciaDesc", userDto.UsuarioExperienciaDesc);
//                DbHelper.AddCommandParameter(command, "Id", userDto.Id);

//                try
//                {
//                    result = command.ExecuteNonQuery();
//                    transaction.Commit();
//                }
//                catch
//                {
//                    transaction.Rollback();
//                    throw;
//                }
//                finally
//                {
//                    if (connection != null)
//                        connection.Close();
//                }

//                return (result > 0);
//            }
//        }

//        public bool DeleteUser(long userId)
//        {
//            int result = 0;
//            string queryString = "DELETE FROM Usuario WHERE Id=@userId;";
//            using (DbConnection connection = DbHelper.CreateDbConnection())
//            {
//                connection.Open();
//                DbCommand command = connection.CreateCommand();

//                command.CommandText = queryString;
//                DbHelper.AddCommandParameter(command, "userId", userId);

//                try
//                {
//                    result = command.ExecuteNonQuery();
//                }
//                catch
//                {
//                    throw;
//                }
//                finally
//                {
//                    if (connection.State == ConnectionState.Open)
//                        connection.Close();
//                }
//            }
//            return (result > 0);
//        }

//        public Usuario GetUser(long userId)
//        {
//            Usuario user = null;
//            string queryString = "SELECT * FROM Usuario WHERE Id=@userId;";
//            using (DbConnection connection = DbHelper.CreateDbConnection())
//            {
//                DbCommand command = connection.CreateCommand();
//                command.CommandText = queryString;

//                DbHelper.AddCommandParameter(command, "userId", userId);
//                connection.Open();
//                DbDataReader reader = command.ExecuteReader();
//                try
//                {
//                    if (reader.HasRows)
//                    {
//                        reader.Read();
//                        user = UserManager.ToUsuarioDto(reader);
//                    }
//                }
//                finally
//                {
//                    // Always call Close when done reading.
//                    reader.Close();
//                }
//            }
//            return user;
//        }

//        public Usuario GetUser(string email)
//        {
//            Usuario user = null;
//            string queryString = "SELECT * FROM Usuario WHERE email=@email;";
//            using (DbConnection connection = DbHelper.CreateDbConnection())
//            {
//                DbCommand command = connection.CreateCommand();
//                command.CommandText = queryString;

//                DbHelper.AddCommandParameter(command, "email", email);
//                connection.Open();
//                DbDataReader reader = command.ExecuteReader();
//                try
//                {
//                    if (reader.HasRows)
//                    {
//                        reader.Read();
//                        user = UserManager.ToUsuarioDto(reader);
//                    }
//                }
//                finally
//                {
//                    // Always call Close when done reading.
//                    reader.Close();
//                }
//            }
//            return user;
//        }

//        public List<Usuario> GetUsers()
//        {
//            List<Usuario> users = new List<Usuario>();
//            string queryString = @"SELECT *
//                                   FROM Usuario
//                                   ORDER BY Apellido ASC, Nombre ASC";
//            using (DbConnection connection = DbHelper.CreateDbConnection())
//            {
//                DbCommand command = connection.CreateCommand();
//                command.CommandText = queryString;

//                connection.Open();
//                DbDataReader reader = command.ExecuteReader();
//                try
//                {
//                    if (reader.HasRows)
//                    {
//                        while (reader.Read())
//                        {
//                            users.Add(UserManager.ToUsuarioDto(reader));

//                        }
//                    }
//                }
//                finally
//                {
//                    // Always call Close when done reading.
//                    reader.Close();
//                }
//            }
//            return users;
//        }

//        #endregion [Basic Operations]

//        public void AddUserToRoles(Usuario userDto, List<long> roles)
//        {
//            string commandText = @"INSERT INTO [UsuarioRol]
//                                               (UsuarioId,RolId)
//                                         VALUES
//                                               (@UserId,@RoleId)";

//            using (DbConnection connection = DbHelper.CreateDbConnection())
//            {
//                connection.Open();

//                DbCommand command = connection.CreateCommand();
//                DbTransaction transaction;

//                transaction = connection.BeginTransaction();

//                command.Connection = connection;
//                command.Transaction = transaction;

//                command.CommandText = commandText;
//                command.Prepare();
//                /// Parametro IdUsuario
//                DbParameter parameter = command.CreateParameter();
//                parameter.ParameterName = "UserId";
//                command.Parameters.Add(parameter);
//                /// Parametro IdRol
//                parameter = command.CreateParameter();
//                parameter.ParameterName = "RoleId";
//                command.Parameters.Add(parameter);

//                try
//                {
//                    for (int i = 0; i < roles.Count(); i++)
//                    {
//                        command.Parameters["UserId"].Value = userDto.Id;
//                        command.Parameters["RoleId"].Value = roles[i];
//                        command.ExecuteNonQuery();
//                    }

//                    transaction.Commit();
//                }
//                catch
//                {
//                    transaction.Rollback();
//                    throw;
//                }
//            }
//        }

//        public void RemoveUserFromRoles(Usuario userDto, List<long> roles)
//        {
//            string commandText = @"DELETE FROM [UsuarioRol]
//                                    WHERE UsuarioId= @UserId
//                                      AND RolId=@RoleId";

//            using (DbConnection connection = DbHelper.CreateDbConnection())
//            {
//                connection.Open();

//                DbCommand command = connection.CreateCommand();

//                command.Connection = connection;

//                command.CommandText = commandText;
//                command.Prepare();
//                /// Parametro IdUsuario
//                DbParameter parameter = command.CreateParameter();
//                parameter.ParameterName = "UserId";
//                command.Parameters.Add(parameter);
//                /// Parametro IdRol
//                parameter = command.CreateParameter();
//                parameter.ParameterName = "RoleId";
//                command.Parameters.Add(parameter);

//                try
//                {
//                    for (int i = 0; i < roles.Count(); i++)
//                    {
//                        command.Parameters["UserId"].Value = userDto.Id;
//                        command.Parameters["RoleId"].Value = roles[i];
//                        command.ExecuteNonQuery();
//                    }
//                }
//                catch
//                {
//                    throw;
//                }
//            }
//        }

//        public bool ChangePassword(long userId, string newPassword)
//        {
//            int result = 0;
//            string queryString = @"UPDATE [Usuario]
//                                       SET [Password] = @newPassword
//                                     WHERE Id=@Id";

//            using (DbConnection connection = DbHelper.CreateDbConnection())
//            {
//                connection.Open();

//                DbCommand command = connection.CreateCommand();
//                DbTransaction transaction;

//                // Start a local transaction.
//                transaction = connection.BeginTransaction();

//                // Must assign both transaction object and connection
//                // to Command object for a pending local transaction
//                command.Connection = connection;
//                command.Transaction = transaction;
//                command.CommandText = queryString;

//                DbHelper.AddCommandParameter(command, "newPassword", newPassword);
//                DbHelper.AddCommandParameter(command, "Id", userId);

//                try
//                {
//                    result = command.ExecuteNonQuery();
//                    transaction.Commit();
//                }
//                catch
//                {
//                    transaction.Rollback();
//                    throw;
//                }
//                finally
//                {
//                    if (connection != null)
//                        connection.Close();
//                }

//                return (result > 0);
//            }
//        }

////        public List<UsuarioDto> GetUsers(UserSearchDto search)
////        {
////            List<UsuarioDto> users = new List<UsuarioDto>();
////            string queryString = @"SELECT * 
////                                     FROM Usuario
////                                    WHERE (@firstName = '' OR Nombre LIKE '%' + @firstName + '%')
////                                      AND (@lastName = '' OR Apellido LIKE '%' + @lastName + '%')
////                                      AND (@email = '' OR Email LIKE '%' + @email + '%')";
////            using (DbConnection connection = DbHelper.CreateDbConnection())
////            {
////                DbCommand command = connection.CreateCommand();
////                command.CommandText = queryString;

////                // Search Parameters
////                DbHelper.AddCommandParameter(command, "firstName", search.FirstName);
////                DbHelper.AddCommandParameter(command, "lastName", search.LastName);
////                DbHelper.AddCommandParameter(command, "userName", search.UserName);
////                DbHelper.AddCommandParameter(command, "email", search.Email);

////                connection.Open();
////                DbDataReader reader = command.ExecuteReader();
////                try
////                {
////                    if (reader.HasRows)
////                    {
////                        while (reader.Read())
////                        {
////                            users.Add(UserManager.ToUsuarioDto(reader));

////                        }
////                    }
////                }
////                finally
////                {
////                    // Always call Close when done reading.
////                    reader.Close();
////                }
////            }
////            return users;
////        }

//        public static Usuario ToUsuarioDto(DbDataReader reader)
//        {
//            Usuario dto = new Usuario();
                        
//            dto.Id = long.Parse(reader["Id"].ToString());
//            dto.Email = reader["Email"].ToString();
//            dto.Password = reader["Password"].ToString();
//            dto.Nombre = reader["Nombre"].ToString();
//            dto.Apellido = reader["Apellido"].ToString();
//            dto.CUIL = BuilderHelper.GetNullableInt(reader["CUIL"]);
//            dto.TipoDocumento = BuilderHelper.GetNullableInt(reader["TipoDocumentoId"].ToString());
//            dto.NroDocumento = BuilderHelper.GetNullableLong(reader["NroDocumento"].ToString());
//            dto.Legajo = BuilderHelper.GetNullableInt(reader["Legajo"].ToString());
//            dto.Activo = bool.Parse(reader["Activo"].ToString());
//            dto.PreguntaSecreta = reader["PreguntaSecreta"].ToString();
//            dto.RespuestaSecreta = reader["RespuestaSecreta"].ToString();
//            dto.PathCurriculumVitae = reader["PathCurriculumVitae"].ToString();
//            dto.UsuarioExperienciaDesc = reader["UsuarioExperienciaDesc"].ToString();
//            dto.GuidMailConfirmacion = Guid.Parse(reader["GuidMailConfirmacion"].ToString());

//            return dto;
//        }

//        internal bool RemoveUserFromAllRoles(long userId)
//        {
//            int result = 0;
//            string queryString = "DELETE FROM UsuarioRol WHERE UsuarioId=@userId;";
//            using (DbConnection connection = DbHelper.CreateDbConnection())
//            {
//                connection.Open();
//                DbCommand command = connection.CreateCommand();

//                command.CommandText = queryString;
//                DbHelper.AddCommandParameter(command, "userId", userId);

//                try
//                {
//                    result = command.ExecuteNonQuery();
//                }
//                catch
//                {
//                    throw;
//                }
//                finally
//                {
//                    if (connection.State == ConnectionState.Open)
//                        connection.Close();
//                }
//            }
//            return (result > 0);
//        }
//    }
//}
